{"componentChunkName":"component---src-templates-post-tsx","path":"/this/","result":{"data":{"markdownRemark":{"html":"<h1 id=\"this란\" style=\"position:relative;\"><a href=\"#this%EB%9E%80\" aria-label=\"this란 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>this란?</h1>\n<hr>\n<blockquote>\n<p><strong>함수 내에서 함수를 호출한 객체에 접근하기 위한 JS의 키워드</strong></p>\n</blockquote>\n<p>  함수 내에서 <code class=\"language-text\">this</code>를 보신 적이 있으신가요? 특히 <code class=\"language-text\">Class</code>나 객체를 생성하기 위해서 선언하는 함수를 사용한 경험이 있다면, <code class=\"language-text\">this</code>를 많이 보셨을 겁니다. python의 <code class=\"language-text\">self</code>와 같이 <code class=\"language-text\">this</code>는 기본적으로 함수를 호출하는 객체를 가리키고 있지만, 선언 방식이나 호출 방식에 따라 전혀 다른 결과가 나올 수 있습니다. 사실 <code class=\"language-text\">this</code>를 사용할 일이 잘 없지만, 알고 사용하는 것과 모르고 사용하는 것에는 큰 차이가 존재하기 때문에 이번 기회에 정리해보고자 합니다. <code class=\"language-text\">this</code> 바인딩룰을 소개하기 전에 바인딩룰에 필요한 기본 개념들을 먼저 소개하도록 하겠습니다.</p>\n<br/>\n<h2 id=\"기본-개념\" style=\"position:relative;\"><a href=\"#%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90\" aria-label=\"기본 개념 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>기본 개념</h2>\n<hr>\n<h3 id=\"1-code-classlanguage-textnewcode-연산자를-통한-객체의-생성-과정\" style=\"position:relative;\"><a href=\"#1-code-classlanguage-textnewcode-%EC%97%B0%EC%82%B0%EC%9E%90%EB%A5%BC-%ED%86%B5%ED%95%9C-%EA%B0%9D%EC%B2%B4%EC%9D%98-%EC%83%9D%EC%84%B1-%EA%B3%BC%EC%A0%95\" aria-label=\"1 code classlanguage textnewcode 연산자를 통한 객체의 생성 과정 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. <code class=\"language-text\">new</code> 연산자를 통한 객체의 생성 과정</h3>\n<p>  객체의 형식을 정의하는 생성자 함수와 <code class=\"language-text\">new</code> 연산자를 통해 객체를 생성할 수 있습니다. 이 방식은 세부적으로 아래와 같이 동작합니다.</p>\n<ol>\n<li>\n<p><strong>새로운 객체를 생성하고 생성된 객체가 생성자 함수의 <em>Prototype Object</em>를 참조할 수 있도록 합니다.</strong></p>\n<blockquote>\n<p>구체적으로 표현하자면, 생성자 함수가 가지는 <em>Prototype Object</em>를 <em>Prototype Link</em>에 바인딩 된 새로운 객체를 생성합니다.</p>\n</blockquote>\n</li>\n<li><strong>생성된 객체를 함수 내의 <code class=\"language-text\">this</code>로 바인딩하여 함수를 수행합니다. 이때, <code class=\"language-text\">this</code>를 통해 명시적으로 호출되는 프로퍼티와 메소드를 객체에 추가합니다.</strong><br>\n<br/></li>\n<li><strong>함수의 수행이 완료되면 해당 객체를 반환합니다.</strong>  </li>\n</ol>\n<p>위 생성방식에서처럼 생성자 함수를 통해 객체의 프로퍼티와 메소드를 정의하기 위해서는 반드시 <code class=\"language-text\">this</code>를 사용해야 한다는 것을 알 수 있습니다.</p>\n<br/>\n<h3 id=\"2-lexical-scope\" style=\"position:relative;\"><a href=\"#2-lexical-scope\" aria-label=\"2 lexical scope permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. lexical scope</h3>\n<blockquote>\n<p><strong>렉시컬 스코프란, 함수의 스코프가 함수의 선언시점의 스코프로 결정되는 방식</strong></p>\n</blockquote>\n<p>  스코프는 참조가 가능한 식별자들의 집합으로, 참조 범위를 의미합니다. 자바스크립트는 기본적으로 '함수 블록 스코프'를 사용합니다. 상위 함수 블록에 대해서만 참조가 가능하다는 것입니다. 하지만 '함수 블록 스코프' 만으로는 명확한 참조 범위를 정의할 수 없습니다. 다음의 예를 봅시다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> x <span class=\"token operator\">=</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">f1</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">const</span> x <span class=\"token operator\">=</span> <span class=\"token number\">20</span><span class=\"token punctuation\">;</span>\n\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>           <span class=\"token comment\">// .... 1</span>\n\t\t<span class=\"token function\">f2</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">f2</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>            <span class=\"token comment\">// .... 2</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">f1</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>  함수 <code class=\"language-text\">f1</code>의 출력값은 '함수 블록 스코프'이기 때문에 <code class=\"language-text\">f1</code> 내부에 정의된 <code class=\"language-text\">x</code>의 값 20을 출력합니다. 하지만 문제는 <code class=\"language-text\">f2</code>의 출력값입니다. '함수 블록 스코프'를 사용한다고 하였는데, 함수 <code class=\"language-text\">f2</code>는 선언 시점의 스코프와 실행 시점의 스코프가 다릅니다. 선언 시점의 스코프는 전역이지만 수행 시점의 스코프는 <code class=\"language-text\">f1</code>내부입니다. 만약 선언 시점의 스코프를 사용한다면 전역의 <code class=\"language-text\">x</code>, 10의 값을 출력하지만 수행 시점의 스코프를 사용한다면 내부 변수 <code class=\"language-text\">x</code>, 20의 값을 출력할 것입니다. 여기서 <strong>JS는 선언 시점의 스코프를 사용하는 '렉시컬 스코프'를 사용합니다.</strong> 즉, 호출 시점의 스코프가 아닌 선언 시점의 스코프를 사용하기 때문에 <code class=\"language-text\">f2</code>의 출력값은 전역의 <code class=\"language-text\">x</code>, 10의 값이 됩니다. 이렇게 <strong>JS는 '함수 블록 스코프'와 '렉시컬 스코프'를 사용합니다. 함수는 자신이 선언된 상위 함수 블록이 스코프가 됩니다.</strong></p>\n<br/>\n<br/>\n<h1 id=\"this-바인딩-룰\" style=\"position:relative;\"><a href=\"#this-%EB%B0%94%EC%9D%B8%EB%94%A9-%EB%A3%B0\" aria-label=\"this 바인딩 룰 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>this 바인딩 룰</h1>\n<hr>\n<p>  이제 <code class=\"language-text\">this</code> 바인딩룰을 제시하고 각각에 대해 설명해보자 합니다. 먼저 <code class=\"language-text\">this</code> 바인딩룰 전체를 살펴보겠습니다.</p>\n<ol>\n<li><strong>기본적으로 <code class=\"language-text\">this</code>는 함수를 호출하는 객체에 바인딩 됩니다. 호출하는 객체가 명시되지 않은 단순 함수 호출의 경우, 전역객체에 바인딩 됩니다.</strong><br>\n<br/></li>\n<li><strong>함수의 내부 함수는 외부 함수의 <code class=\"language-text\">this</code>로 바인딩 되지 않습니다.</strong><br>\n<br/> </li>\n<li><strong>화살표 함수</strong>(<strong>Arrow function)의 경우, <code class=\"language-text\">this</code>가 존재하지 않습니다. 그러므로 화살표 함수 내의 <code class=\"language-text\">this</code>는 다른 변수와 동일하게 함수의 렉시컬 스코프 상의 <code class=\"language-text\">this</code>를 참조합니다.</strong><br>\n<br/>  </li>\n<li><strong>클래스(Class)의 경우, 함수 블록 상의 모든 코드는 <em>'strict mode'</em>로 수행됩니다.  '<em>strict mode</em>'는 기본적으로 <code class=\"language-text\">this</code>를 자동으로 바인딩하지 않으며, 호출 객체가 명시되지 않은 경우, <code class=\"language-text\">undefined</code>를 반환합니다.</strong>  </li>\n</ol>\n<p>  1번 규칙이 기본 규칙이라고 한다면, 나머지는 특수한 상황에서의 규칙이라고 볼 수 있겠습니다. 이제 규칙을 예제와 함께 하나씩 설명해보겠습니다.</p>\n<br/>\n<h3 id=\"1-기본적으로-code-classlanguage-textthiscode는-함수를-호출하는-객체에-바인딩-됩니다-호출하는-객체가-명시되지-않은-단순-함수-호출의-경우-전역객체에-바인딩-됩니다\" style=\"position:relative;\"><a href=\"#1-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9C%BC%EB%A1%9C-code-classlanguage-textthiscode%EB%8A%94-%ED%95%A8%EC%88%98%EB%A5%BC-%ED%98%B8%EC%B6%9C%ED%95%98%EB%8A%94-%EA%B0%9D%EC%B2%B4%EC%97%90-%EB%B0%94%EC%9D%B8%EB%94%A9-%EB%90%A9%EB%8B%88%EB%8B%A4-%ED%98%B8%EC%B6%9C%ED%95%98%EB%8A%94-%EA%B0%9D%EC%B2%B4%EA%B0%80-%EB%AA%85%EC%8B%9C%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%80-%EB%8B%A8%EC%88%9C-%ED%95%A8%EC%88%98-%ED%98%B8%EC%B6%9C%EC%9D%98-%EA%B2%BD%EC%9A%B0-%EC%A0%84%EC%97%AD%EA%B0%9D%EC%B2%B4%EC%97%90-%EB%B0%94%EC%9D%B8%EB%94%A9-%EB%90%A9%EB%8B%88%EB%8B%A4\" aria-label=\"1 기본적으로 code classlanguage textthiscode는 함수를 호출하는 객체에 바인딩 됩니다 호출하는 객체가 명시되지 않은 단순 함수 호출의 경우 전역객체에 바인딩 됩니다 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. 기본적으로 <code class=\"language-text\">this</code>는 함수를 호출하는 객체에 바인딩 됩니다. 호출하는 객체가 명시되지 않은 단순 함수 호출의 경우, 전역객체에 바인딩 됩니다.</h3>\n<p>  <code class=\"language-text\">this</code>는 함수를 호출한 객체에 접근하기 위한 JS의 키워드라고 하였습니다. 메소드는 <code class=\"language-text\">this</code>를 통해 자신을 호출한 객체에 접근할 수 있습니다. 하지만 <strong>호출 객체가 명시되지 않은 경우 전역객체에 바인딩 됩니다.</strong> 이때, 전역객체는 JS가 수행되는 환경에 따라 달라집니다.  </p>\n<ul>\n<li>\n<p><strong>전역객체의 종류</strong></p>\n<ol>\n<li><em>Node</em> - <code class=\"language-text\">global</code></li>\n<li><em>Browser</em> - <code class=\"language-text\">window</code></li>\n<li><em>strict mode</em> - <code class=\"language-text\">undefined</code></li>\n<li><em>DOM</em> - <code class=\"language-text\">document</code> (전역 객체라기보다는 최상위 객체의 개념)</li>\n</ol>\n</li>\n</ul>\n<p>  예제를 통해 첫 번째 규칙을 설명해보도록 하겠습니다. <span class='small-text'>(설명을 위해 모든 예제는 전역객체가 window로 바인딩 되는 브라우저상에서 수행합니다.)</span>  </p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">Human</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                  \n    \n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">methodA</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>              \n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> chanwoo <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Human</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>         <span class=\"token comment\">// .... 1</span>\n\n<span class=\"token keyword\">const</span> chanjong <span class=\"token operator\">=</span> <span class=\"token function\">Human</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>            <span class=\"token comment\">// .... 2</span>\n\nchanwoo<span class=\"token punctuation\">.</span><span class=\"token function\">methodA</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                   <span class=\"token comment\">// .... 3</span>\n\n<span class=\"token keyword\">const</span> methodAA <span class=\"token operator\">=</span> chanwoo<span class=\"token punctuation\">.</span>methodA<span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">methodAA</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                           <span class=\"token comment\">// .... 4</span></code></pre></div>\n<p>  생성자 함수 <code class=\"language-text\">Human</code>를 통해 인스턴스 <code class=\"language-text\">chanwoo</code>가 생성되었습니다. 인스턴스는 메소드 <code class=\"language-text\">methodA()</code>를 가지고 있습니다. 출력값을 하나씩 살펴보겠습니다.</p>\n<ol>\n<li><strong>인스턴스 <code class=\"language-text\">chanwoo</code></strong> - <code class=\"language-text\">new</code> 연산자를 통해 생성자 함수를 호출하게 되면 <code class=\"language-text\">this</code>가 새롭게 생성된 객체로 바인딩 되기 때문에 생성된 객체가 생성자 함수를 호출하는 것으로 볼 수 있습니다.<br>\n<br/></li>\n<li><strong>전역객체 <code class=\"language-text\">window</code></strong> - 생성자 함수를 단순 호출하게 되면, 객체 생성이 수행되지 않기 때문에 함수와 마찬가지로 전역객체에 바인딩 됩니다.<br>\n<br/></li>\n<li><strong>인스턴스 <code class=\"language-text\">chanwoo</code></strong> - 인스턴스 <code class=\"language-text\">chanwoo</code>는 생성자 함수 내의 <code class=\"language-text\">this</code>를 통해 <code class=\"language-text\">methodA()</code> 를 갖게 됩니다. 또한 메소드를 호출하는 객체는 <code class=\"language-text\">chanwoo</code>이므로 호출하는 객체에 바인딩되는 룰에 의해 출력값은 인스턴스 <code class=\"language-text\">chanwoo</code>가 됩니다.<br>\n<br/></li>\n<li><strong>전역객체 <code class=\"language-text\">window</code></strong> -  인스턴스 <code class=\"language-text\">chanwoo</code>가 가진 <code class=\"language-text\">methodA()</code>를 새로운 함수 <code class=\"language-text\">methodAA()</code>로 할당하여 호출하였습니다.  <code class=\"language-text\">methodAA()</code>는 인스턴스 <code class=\"language-text\">chanwoo</code>의 <code class=\"language-text\">methodA()</code>이지만 메소드가 어떤 인스턴스에 정의되어있는가는 중요하지 않습니다. 중요한 것은 호출하는 객체입니다. <code class=\"language-text\">methodAA()</code>의 호출하는 객체는 명시되지 않았기 때문에 전역객체에 바인딩 됩니다.</li>\n</ol>\n<br/>\n<br/>\n<h3 id=\"2-함수의-내부-함수는-외부-함수의-code-classlanguage-textthiscode로-바인딩-되지-않습니다\" style=\"position:relative;\"><a href=\"#2-%ED%95%A8%EC%88%98%EC%9D%98-%EB%82%B4%EB%B6%80-%ED%95%A8%EC%88%98%EB%8A%94-%EC%99%B8%EB%B6%80-%ED%95%A8%EC%88%98%EC%9D%98-code-classlanguage-textthiscode%EB%A1%9C-%EB%B0%94%EC%9D%B8%EB%94%A9-%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4\" aria-label=\"2 함수의 내부 함수는 외부 함수의 code classlanguage textthiscode로 바인딩 되지 않습니다 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. 함수의 내부 함수는 외부 함수의 <code class=\"language-text\">this</code>로 바인딩 되지 않습니다.</h3>\n<p>  1번 규칙 4번 예제에서 메소드의 <code class=\"language-text\">this</code> 는 정의된 인스턴스가 아닌 호출하는 인스턴스에 바인딩 되는 것을 확인하였습니다. 사실 이러한 결과가 나타나는 것은 <strong>중첩된 함수에서 외부 함수 내 선언된 내부 함수의 <code class=\"language-text\">this</code>는 외부 함수의 <code class=\"language-text\">this</code>로 바인딩 되지 않기 때문</strong>입니다. 만약 내부 함수의 <code class=\"language-text\">this</code>가 외부 함수의 <code class=\"language-text\">this</code>로 바인딩 되었다면, 1번 규칙 4번 예제의 결과는 인스턴스 <code class=\"language-text\">chanwoo</code>가 출력되었을 것입니다. 아래의 예제를 통해 한 번 더 확인해봅시다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">Human</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\n\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">methodA</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>              <span class=\"token comment\">// .... 1</span>\n\t\t\t\t\n\t\t\t\t<span class=\"token keyword\">function</span> <span class=\"token function\">innerFunc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\n\t\t\t\t<span class=\"token function\">innerFunc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                    <span class=\"token comment\">// .... 2</span>\n\t\t<span class=\"token punctuation\">}</span>\n\n\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">methodB</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>              <span class=\"token comment\">// .... 3</span>\n\t\t\t\t<span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t    \t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>          <span class=\"token comment\">// .... 4</span>\n\t\t    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\t\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> chanwoo <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Human</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nchanwoo<span class=\"token punctuation\">.</span><span class=\"token function\">methodA</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nchanwoo<span class=\"token punctuation\">.</span><span class=\"token function\">methodB</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>  <code class=\"language-text\">methodA()</code>는 <code class=\"language-text\">this</code>를 통해 자신을 호출한 객체를 출력하고, 내부에 <code class=\"language-text\">innerFunc()</code>함수를 선언, 수행합니다. <code class=\"language-text\">methodB()</code>는 내부에서 비동기 함수를 사용, 콜백 함수를 통해서 <code class=\"language-text\">this</code>를 출력합니다. 두 메소드를 사용하였을 때의 <code class=\"language-text\">this</code> 바인딩의 결과를 살펴보도록 하겠습니다.</p>\n<ol>\n<li><strong>인스턴스 <code class=\"language-text\">chanwoo</code> -</strong> <code class=\"language-text\">methodA()</code>을 호출하는 객체가 인스턴스 <code class=\"language-text\">chanwoo</code>이기 때문에 <code class=\"language-text\">this</code>의 출력값은 <code class=\"language-text\">chanwoo</code>입니다.<br>\n<br/></li>\n<li><strong>전역객체 <code class=\"language-text\">window</code> -</strong> 내부함수의 <code class=\"language-text\">this</code>는 외부함수의 <code class=\"language-text\">this</code>에 바인딩 되지 않습니다. 내부 함수의 호출 객체를 확인해야 합니다. 현재 호출객체가 명시되어있지 않기 때문에 전역객체에 바인딩 됩니다.<br>\n<br/></li>\n<li><strong>인스턴스 <code class=\"language-text\">chanwoo</code> -</strong> <code class=\"language-text\">methodB()</code>을 호출하는 객체가 인스턴스 <code class=\"language-text\">chanwoo</code>이기 때문에 <code class=\"language-text\">this</code>의 출력값은 <code class=\"language-text\">chanwoo</code>입니다.<br>\n<br/></li>\n<li><strong>전역객체 <code class=\"language-text\">window</code> -</strong> 내부함수의 <code class=\"language-text\">this</code>는  외부함수의 <code class=\"language-text\">this</code>에 바인딩되지 않는다고 배웠습니다. 비동기 콜백 함수도 동일합니다. 콜백 함수의 호출 객체는 명시되어있지 않기 때문에 반드시 전역객체에 바인딩 됩니다. 중요한 것은 함수의 호출객체라는 점은 1번 규칙과 동일하다는 것을 알 수 있습니다.</li>\n</ol>\n<br/>\n<br/>\n<h3 id=\"3-화살표-함수arrow-function의-경우-code-classlanguage-textthiscode가-존재하지-않습니다-그러므로-화살표-함수-내의-code-classlanguage-textthiscode는-다른-변수와-동일하게-함수의-렉시컬-스코프-상의-code-classlanguage-textthiscode를-참조합니다\" style=\"position:relative;\"><a href=\"#3-%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98arrow-function%EC%9D%98-%EA%B2%BD%EC%9A%B0-code-classlanguage-textthiscode%EA%B0%80-%EC%A1%B4%EC%9E%AC%ED%95%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4-%EA%B7%B8%EB%9F%AC%EB%AF%80%EB%A1%9C-%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98-%EB%82%B4%EC%9D%98-code-classlanguage-textthiscode%EB%8A%94-%EB%8B%A4%EB%A5%B8-%EB%B3%80%EC%88%98%EC%99%80-%EB%8F%99%EC%9D%BC%ED%95%98%EA%B2%8C-%ED%95%A8%EC%88%98%EC%9D%98-%EB%A0%89%EC%8B%9C%EC%BB%AC-%EC%8A%A4%EC%BD%94%ED%94%84-%EC%83%81%EC%9D%98-code-classlanguage-textthiscode%EB%A5%BC-%EC%B0%B8%EC%A1%B0%ED%95%A9%EB%8B%88%EB%8B%A4\" aria-label=\"3 화살표 함수arrow function의 경우 code classlanguage textthiscode가 존재하지 않습니다 그러므로 화살표 함수 내의 code classlanguage textthiscode는 다른 변수와 동일하게 함수의 렉시컬 스코프 상의 code classlanguage textthiscode를 참조합니다 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. 화살표 함수(Arrow function)의 경우, <code class=\"language-text\">this</code>가 존재하지 않습니다. 그러므로 화살표 함수 내의 <code class=\"language-text\">this</code>는 다른 변수와 동일하게 함수의 렉시컬 스코프 상의 <code class=\"language-text\">this</code>를 참조합니다.</h3>\n<p>  화살표 함수는 <code class=\"language-text\">function</code> 키워드 대신 <code class=\"language-text\">()=&gt;{}</code>의 형태로 정의하는 함수를 말합니다. 즉, 화살표 함수는 함수를 정의하는 또 다른 방식입니다. 이렇게 두 가지 방식을 제공하는 것에는 이유가 있습니다. <strong>바로 <code class=\"language-text\">this</code> 바인딩에 대한 차이입니다.</strong> <em>mozlia docs</em>의 화살표 함수에 대한 글을 번역하면 다음과 같습니다.</p>\n<blockquote>\n<p><strong>arrow function은 함수를 편리하게 선언할 수 있는 시맨틱 슈가로만 볼 수 있다. 하지만 그 차이는 this의 바인딩에 있다. 기본적으로 arrow function은 함수 내에 this를 가지지 않는다. 단순히 렉시컬 스코프 상의 this를 참조한다. 이를 통해서 (setTimeout, setInterval, addEventListener) 와 같은 DOM-element function에서의 this 바인딩의 목적을 가진다.</strong></p>\n</blockquote>\n<p>  2번 규칙에 따라 내부 함수의 <code class=\"language-text\">this</code>는 외부 함수의 <code class=\"language-text\">this</code>에 바인딩 되지 않습니다. 위의 2번 규칙 1번 예시에서처럼 외부함수의 <code class=\"language-text\">this</code>를 사용하고자 함에도 전역객체로 바인딩 되어 사용하지 못하는 경우가 발생합니다. 이러한 바인딩 문제를 해결하기 위해서 화살표 함수를 사용합니다. <strong>화살표 함수의 <code class=\"language-text\">this</code>는 렉시컬 스코프 상의 <code class=\"language-text\">this</code>를 참조하기 때문에 <code class=\"language-text\">this</code>는 내부 함수를 화살표 함수로 선언하게 되면 외부 함수의 <code class=\"language-text\">this</code>를 참조하여 사용할 수 있게 됩니다.</strong> 위 예제들을 화살표 함수로 바꿔서 출력값을 확인해보도록 하겠습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">Human</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">methodA</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>              <span class=\"token comment\">// .... 1</span>\n\t\t\t\t\n\t\t\t\t<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">innerFunc</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\t\t\t\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\n\t\t\t\t<span class=\"token function\">innerFunc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                    <span class=\"token comment\">// .... 2</span>\n\t\t<span class=\"token punctuation\">}</span>\n\n\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">methodB</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>              <span class=\"token comment\">// .... 3</span>\n\t\t\t\t<span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\t\t    \t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>          <span class=\"token comment\">// .... 4</span>\n\t\t    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t\t  \n\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">methodC</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\t\t\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> chanwoo <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Human</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nchanwoo<span class=\"token punctuation\">.</span><span class=\"token function\">methodA</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nchanwoo<span class=\"token punctuation\">.</span><span class=\"token function\">methodB</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> methodAA <span class=\"token operator\">=</span> chanwoo<span class=\"token punctuation\">.</span>methodA<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> methodCC <span class=\"token operator\">=</span> chanwoo<span class=\"token punctuation\">.</span>methodC<span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">methodAA</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                             <span class=\"token comment\">// ... 5</span>\n<span class=\"token function\">methodCC</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                             <span class=\"token comment\">// ... 6</span></code></pre></div>\n<ol>\n<li><strong>인스턴스 <code class=\"language-text\">chanwoo</code> -</strong> <code class=\"language-text\">methodA()</code>을 호출하는 객체가 인스턴스 <code class=\"language-text\">chanwoo</code>이기 때문에 <code class=\"language-text\">this</code>의 출력값은 <code class=\"language-text\">chanwoo</code>입니다.<br>\n<br/>    </li>\n<li>\n<p><strong>인스턴스 <code class=\"language-text\">chanwoo</code> -</strong> <code class=\"language-text\">innerFunc()</code>가 화살표 함수로 선언되었습니다. 화살표 함수는 <code class=\"language-text\">this</code>가 렉시컬 스코프 상의 <code class=\"language-text\">this</code>를 참조하기 때문에 1번의 <code class=\"language-text\">this</code>와 동일한 객체 <code class=\"language-text\">chanwoo</code>를 출력합니다. 즉, <code class=\"language-text\">innerFunc()</code>선언한 함수 스코프 상의 <code class=\"language-text\">this</code>를 참조하기 때문에 반드시 상위 함수 <code class=\"language-text\">methodA()</code>의 <code class=\"language-text\">this</code>와 동일한 값을 가지게 됩니다.  </p>\n<ul>\n<li>중요한 것은 <code class=\"language-text\">innerFunc()</code>를 <code class=\"language-text\">function</code> 키워드로 정의한 2번 규칙 2번 예제와의 차이입니다. <strong>내부함수의 <code class=\"language-text\">this</code>는 외부함수의 <code class=\"language-text\">this</code>에 바인딩 되지 않고, 호출객체가 명시되어있지 않기 때문에 전역객체에 바인딩 되는 결과를 보았을 겁니다.</strong> 이렇게 내부 함수에서도 호출 객체에 접근하기 위해서 화살표 함수를 사용합니다.<br>\n<br/></li>\n</ul>\n</li>\n<li><strong>인스턴스 <code class=\"language-text\">chanwoo</code> -</strong> <code class=\"language-text\">methodB()</code>을 호출하는 객체가 인스턴스 <code class=\"language-text\">chanwoo</code>이기 때문에 <code class=\"language-text\">this</code>의 출력값은 <code class=\"language-text\">chanwoo</code>입니다.<br>\n<br/>\n</li>\n<li><strong>인스턴스 <code class=\"language-text\">chanwoo</code> -</strong>  <code class=\"language-text\">setTimeout()</code>의 콜백 함수가 화살표 함수로 선언되었습니다. 화살표 함수는 <code class=\"language-text\">this</code>가 렉시컬 스코프 상의 <code class=\"language-text\">this</code>를 참조하기 때문에 3번의 <code class=\"language-text\">this</code>와 동일한 객체 <code class=\"language-text\">chanwoo</code>를 출력합니다. 즉, <code class=\"language-text\">setTimeout()</code>의 콜백 함수를 선언한 함수 스코프 상의 <code class=\"language-text\">this</code>를 참조하기 때문에 반드시 상위 함수 <code class=\"language-text\">methodB()</code>의 <code class=\"language-text\">this</code>와 동일한 값을 가지게 됩니다.<br>\n<br/></li>\n<li><strong>전역객체 <code class=\"language-text\">window</code> -</strong> 인스턴스 <code class=\"language-text\">chanwoo</code>의 메소드 <code class=\"language-text\">methodA()</code>를 새로운 함수로 선언하여 호출하였습니다. 중요한 것은 호출 객체라고 배웠습니다. <code class=\"language-text\">methodAA()</code>를 호출하는 객체가 명시되어있지 않기 때문에 <code class=\"language-text\">this</code>는 전역 객체에 바인딩 됩니다. 화살표 함수 <code class=\"language-text\">innerFunc()</code>의 <code class=\"language-text\">this</code> 또한 동일한 객체를 출력합니다.<br>\n<br/></li>\n<li>\n<p><strong>인스턴스 <code class=\"language-text\">chanwoo</code> -</strong> 인스턴스 <code class=\"language-text\">chanwoo</code>의 메소드 <code class=\"language-text\">methodC()</code>를 새로운 함수 <code class=\"language-text\">methodCC()</code>로 선언하여 호출하였습니다. <code class=\"language-text\">methodC()</code>는 화살표 함수로 선언되었으며, 화살표 함수는 렉시컬 스코프의 <code class=\"language-text\">this</code>를 참조한다고 설명하였습니다. 렉시컬 스코프는 함수의 선언 시점의 스코프를 말하기 때문에 화살표 함수의 <code class=\"language-text\">this</code>를 찾기 위해서는 선언하는 시점을 확인해야 합니다. <code class=\"language-text\">methodC()</code>가 선언되는 블록은 생성자 함수 내로, 선언 시점의 생성자 함수의 <code class=\"language-text\">this</code>는 새롭게 생성되는 인스턴스가 바인딩 됩니다. 그러므로 <code class=\"language-text\">methodC()</code>의 <code class=\"language-text\">this</code> 또한 인스턴스를 참조하게 됩니다.   </p>\n<ul>\n<li><strong>중요한 것은 화살표 함수의 바인딩은 선언 시점에 이루어지기 때문에 호출 인스턴스의 영향을 받지 않는다는 것입니다.</strong> 화살표 함수의 특성으로 인해 <code class=\"language-text\">methodCC()</code>로 <code class=\"language-text\">chanwoo</code>의 <code class=\"language-text\">methodC()</code>를 선언하여 호출하더라도 <code class=\"language-text\">methodC()</code>의 <code class=\"language-text\">this</code>는 그대로 인스턴스 <code class=\"language-text\">chanwoo</code>를 참조하게 됩니다.<br>\n<br/></li>\n<li><strong>함수 정의 방법에 따라 바인딩을 위해 확인해야 하는 영역이 호출 영역인지, 선언 영역인지의 차이가 존재하는 것을 기억해야 합니다.</strong> <code class=\"language-text\">methodAA()</code>와의 차이를 생각해봅시다. 기존의 <code class=\"language-text\">function</code> 키워드로 선언된 메소드는 호출객체에 바인딩 되었습니다. 하지만 화살표 함수로 선언된 메소드는 호출 객체가 아닌 렉시컬 스코프(선언 시점의 상위 함수 스코프) 상의 <code class=\"language-text\">this</code>를 참조합니다. 이로 인해 호출 객체가 명시되어있지 않음에도 계속해서 <code class=\"language-text\">this</code>를 통해 인스턴스에 접근할 수 있었습니다.   </li>\n</ul>\n</li>\n</ol>\n<blockquote>\n<p><strong>주의할 점은 화살표 함수의 경우, 명시적 <code class=\"language-text\">this</code> 바인딩을 통한 바인딩이 수행되지 않습니다.</strong></p>\n</blockquote>\n<br/>\n<br/>\n<h3 id=\"4-클래스class의-경우-함수-블록-상의-모든-코드는-strict-mode로-수행됩니다--strict-mode는-기본적으로-code-classlanguage-textthiscode를-자동으로-바인딩하지-않으며-호출-객체가-명시되지-않은-경우-code-classlanguage-textundefinedcode를-반환합니다\" style=\"position:relative;\"><a href=\"#4-%ED%81%B4%EB%9E%98%EC%8A%A4class%EC%9D%98-%EA%B2%BD%EC%9A%B0-%ED%95%A8%EC%88%98-%EB%B8%94%EB%A1%9D-%EC%83%81%EC%9D%98-%EB%AA%A8%EB%93%A0-%EC%BD%94%EB%93%9C%EB%8A%94-strict-mode%EB%A1%9C-%EC%88%98%ED%96%89%EB%90%A9%EB%8B%88%EB%8B%A4--strict-mode%EB%8A%94-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9C%BC%EB%A1%9C-code-classlanguage-textthiscode%EB%A5%BC-%EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C-%EB%B0%94%EC%9D%B8%EB%94%A9%ED%95%98%EC%A7%80-%EC%95%8A%EC%9C%BC%EB%A9%B0-%ED%98%B8%EC%B6%9C-%EA%B0%9D%EC%B2%B4%EA%B0%80-%EB%AA%85%EC%8B%9C%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%80-%EA%B2%BD%EC%9A%B0-code-classlanguage-textundefinedcode%EB%A5%BC-%EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4\" aria-label=\"4 클래스class의 경우 함수 블록 상의 모든 코드는 strict mode로 수행됩니다  strict mode는 기본적으로 code classlanguage textthiscode를 자동으로 바인딩하지 않으며 호출 객체가 명시되지 않은 경우 code classlanguage textundefinedcode를 반환합니다 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. <strong>클래스(Class)의 경우, 함수 블록 상의 모든 코드는 <em>'strict mode'</em>로 수행됩니다.  '<em>strict mode</em>'는 기본적으로 <code class=\"language-text\">this</code>를 자동으로 바인딩하지 않으며, 호출 객체가 명시되지 않은 경우, <code class=\"language-text\">undefined</code>를 반환합니다.</strong></h3>\n<p>  클래스는 생성자 함수와 동일하게 인스턴스를 생성하기 위해 사용되는 특수한 함수입니다. 클래스를 사용하더라도 <code class=\"language-text\">this</code>의 바인딩에 대한 위의 규칙들 모두 성립됩니다. 하지만 생성자 함수에서는 <code class=\"language-text\">this</code>가 전역객체에 바인딩 되었다면 클래스에서는 되지 않는다는 점의 차이가 존재합니다. 클래스와 생성자 함수에는 차이를 몇 가지 더 소개하겠습니다.</p>\n<ol>\n<li>클래스의 <code class=\"language-text\">{}</code> 내에서는 <code class=\"language-text\">const</code>, <code class=\"language-text\">function</code>과 같은 키워드를 사용하지 않으며, 프로퍼티와 메소드의 선언 시 생성자 함수에서  <code class=\"language-text\">this.</code>를 생략한 문법을 사용합니다.<br>\n<br/>  </li>\n<li>클래스는 기본적으로 <code class=\"language-text\">new</code> 연산자를 사용하지 않는 호출은 수행될 수 없습니다.<br>\n<br/></li>\n<li>생성자 함수는 메소드가 인스턴스에 선언되지만, 클래스의 메소드는 인스턴스가 아닌 <em>'Prototype Object'</em>에 저장됩니다.  이를 통해 클래스의 인스턴스들은 <em>Prototype Object</em> 내에 선언된 메소드를 공유합니다. <span class='small-text'>(<em>Prototype Object</em> 개념이 낯설다면 이전의 Prototype 포스트를 읽어보시길 권합니다.)</span><br>\n<br/></li>\n<li>클래스는 함수와는 다르게 호이스팅이 되지 않습니다. 반드시 선언 이후 수행되어야 합니다.  </li>\n</ol>\n<p>위의 생성자 함수 <code class=\"language-text\">Human</code>을 클래스로 구현한 예시를 통해 <code class=\"language-text\">this</code> 바인딩을 설명해보겠습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Human</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">name</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t\t\n\t\t<span class=\"token function-variable function\">methodA</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t\t\n\t\t<span class=\"token function-variable function\">methodB</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\t\t\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> chanwoo <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Human</span><span class=\"token punctuation\">(</span><span class=\"token string\">'chanwoo'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nchanwoo<span class=\"token punctuation\">.</span><span class=\"token function\">methodA</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                      <span class=\"token comment\">// ... 1</span>\nchanwoo<span class=\"token punctuation\">.</span><span class=\"token function\">methodB</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                      <span class=\"token comment\">// ... 2</span>\n\n<span class=\"token keyword\">const</span> methodAA <span class=\"token operator\">=</span> chanwoo<span class=\"token punctuation\">.</span>methodA<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> methodBB <span class=\"token operator\">=</span> chanwoo<span class=\"token punctuation\">.</span>methodB<span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">methodAA</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                             <span class=\"token comment\">// ... 3</span>\n<span class=\"token function\">methodBB</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                             <span class=\"token comment\">// ... 4</span></code></pre></div>\n<ol>\n<li><strong>인스턴스 <code class=\"language-text\">chanwoo</code> -</strong> <code class=\"language-text\">methodA()</code>을 호출하는 객체가 인스턴스 <code class=\"language-text\">chanwoo</code>이기 때문에 <code class=\"language-text\">this</code>의 출력값은 <code class=\"language-text\">chanwoo</code>입니다.<br>\n<br/></li>\n<li><strong>인스턴스 <code class=\"language-text\">chanwoo</code> -</strong>  화살표 함수는 렉시컬 스코프의 <code class=\"language-text\">this</code>를 참조한다고 설명하였습니다. <code class=\"language-text\">methodB()</code> 의 <code class=\"language-text\">this</code>는 호출 객체인 인스턴스 <code class=\"language-text\">chanwoo</code>이기 때문에 <code class=\"language-text\">this</code>의 출력값은 <code class=\"language-text\">chanwoo</code>입니다.<br>\n<br/></li>\n<li><strong><code class=\"language-text\">undefined</code> -</strong> 인스턴스 <code class=\"language-text\">chanwoo</code>의 메소드 <code class=\"language-text\">methodA()</code>를 새로운 함수로 선언하여 호출하였습니다. 중요한 것은 호출 객체라고 배웠습니다. <code class=\"language-text\">methodAA()</code>를 호출하는 객체가 명시되어있지 않기 때문에 <code class=\"language-text\">this</code>는 전역 객체에 바인딩 되어야 합니다. 하지만 클래스 내에서는 전역객체가 바인딩 되지 않기 때문에 <code class=\"language-text\">undefined</code>가 출력됩니다.<br>\n<br/></li>\n<li><strong>인스턴스 <code class=\"language-text\">chanwoo</code> -</strong> 인스턴스 <code class=\"language-text\">chanwoo</code>의 메소드 <code class=\"language-text\">methodB()</code>를 새로운 함수 <code class=\"language-text\">methodBB()</code>로 선언하여 호출하였습니다. <code class=\"language-text\">methodB()</code>는 화살표 함수로 선언되었으며, 화살표 함수는 렉시컬 스코프의 <code class=\"language-text\">this</code>를 참조한다고 설명하였습니다. 렉시컬 스코프는 함수의 선언 시점의 스코프를 말하기 때문에 화살표 함수의 <code class=\"language-text\">this</code>를 찾기 위해서는 선언하는 시점을 확인해야 합니다. <code class=\"language-text\">methodB()</code>가 선언되는 블록은 생성자 함수 내로, 선언 시점의 생성자 함수의 <code class=\"language-text\">this</code>는 새롭게 생성되는 인스턴스가 바인딩 됩니다. 그러므로 <code class=\"language-text\">methodBB()</code>의 <code class=\"language-text\">this</code> 또한 자신을 가진 인스턴스 <code class=\"language-text\">chanwoo</code>를 참조하게 됩니다.  </li>\n</ol>\n<br/>\n<br/>\n<h2 id=\"조금-더-복잡한-예\" style=\"position:relative;\"><a href=\"#%EC%A1%B0%EA%B8%88-%EB%8D%94-%EB%B3%B5%EC%9E%A1%ED%95%9C-%EC%98%88\" aria-label=\"조금 더 복잡한 예 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>조금 더 복잡한 예</h2>\n<p>  지금까지 제시한 바인딩룰을 조금 더 복잡한 예제를 통해 연습해보도록 하겠습니다. 위의 설명이 반복될 수 있으니 충분히 이해하셨다면 넘어가시면 되겠습니다. 인스턴스를 생성하는 함수 <code class=\"language-text\">Human</code>을 선언하였습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">Human</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">name</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span> \n\n\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">methodA</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">function</span> <span class=\"token function\">innerFunc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>            \n\t\t<span class=\"token punctuation\">}</span>\n\n\t\t<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">innerArrowFunc</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span><span class=\"token punctuation\">{</span>\n\t\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>             \n\t\t<span class=\"token punctuation\">}</span>\n\t\t\n\t\t<span class=\"token function\">innerFunc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                     <span class=\"token comment\">// .... a</span>\n\t\t<span class=\"token function\">innerArrowFunc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                <span class=\"token comment\">// .... b</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">methodB</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">function</span> <span class=\"token function\">innerFunc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>            \n\t\t<span class=\"token punctuation\">}</span>\n\n\t\t<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">innerArrowFunc</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span><span class=\"token punctuation\">{</span>\n\t\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>             \n\t\t<span class=\"token punctuation\">}</span>\n\t\t\n\t\t<span class=\"token function\">innerFunc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                     <span class=\"token comment\">// .... c</span>\n\t\t<span class=\"token function\">innerArrowFunc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                <span class=\"token comment\">// .... d</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> chanwoo <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Human</span><span class=\"token punctuation\">(</span><span class=\"token string\">'chanwoo'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nchanwoo<span class=\"token punctuation\">.</span><span class=\"token function\">methodA</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                   <span class=\"token comment\">// .... 1</span>\nchanwoo<span class=\"token punctuation\">.</span><span class=\"token function\">methodB</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                   <span class=\"token comment\">// .... 2</span>\n\n<span class=\"token keyword\">const</span> methodAA <span class=\"token operator\">=</span> chanwoo<span class=\"token punctuation\">.</span>methodA<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> methodBB <span class=\"token operator\">=</span> chanwoo<span class=\"token punctuation\">.</span>methodB<span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">methodAA</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                           <span class=\"token comment\">// .... 3</span>\n<span class=\"token function\">methodBB</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                           <span class=\"token comment\">// .... 4</span></code></pre></div>\n<ol>\n<li>\n<p>생성자 함수의 메소드로, 인스턴스 <code class=\"language-text\">chanwoo</code>에 의해 호출되었습니다. 외부 함수인 <code class=\"language-text\">methodA()</code>의 <code class=\"language-text\">this</code>는 자신의 호출 객체 인스턴스 <code class=\"language-text\">chanwoo</code>에 바인딩 되었습니다.  </p>\n<ol>\n<li><strong>전역객체 <code class=\"language-text\">window</code> -</strong> 내부 함수의 <code class=\"language-text\">this</code>는 외부 함수의 <code class=\"language-text\">this</code>로 바인딩 되지 않고 전역객체에 바인딩 됩니다.<br>\n<br/></li>\n<li><strong>인스턴스 <code class=\"language-text\">chanwoo</code> -</strong> 화살표 함수는 <code class=\"language-text\">this</code>가 렉시컬 스코프 상의 <code class=\"language-text\">this</code>를 참조하기 때문에 외부 함수의 <code class=\"language-text\">this</code>와 동일하게 됩니다.<br>\n<br/></li>\n</ol>\n</li>\n<li>\n<p>생성자 함수의 메소드로, 인스턴스 <code class=\"language-text\">chanwoo</code>에 의해 호출되었습니다. <code class=\"language-text\">methodB()</code>는 화살표 함수로 선언되었기 때문에 렉시컬 스코프 상의 <code class=\"language-text\">this</code>를 참조합니다. 상위 스코프인 생성자 함수 내의 <code class=\"language-text\">this</code>는 새롭게 생성되는 인스턴스에 바인딩 되고, <code class=\"language-text\">methodB()</code>의 <code class=\"language-text\">this</code> 또한 인스턴스 <code class=\"language-text\">chanwoo</code>에 바인딩 되었습니다.  </p>\n<ol>\n<li><strong>전역객체 <code class=\"language-text\">window</code> -</strong> 내부 함수의 <code class=\"language-text\">this</code>는 외부 함수의 <code class=\"language-text\">this</code>로 바인딩 되지 않고 전역객체에 바인딩 됩니다.<br>\n<br/> </li>\n<li><strong>인스턴스 <code class=\"language-text\">chanwoo</code> -</strong> 화살표 함수의 <code class=\"language-text\">this</code>는 렉시컬 스코프 상의 <code class=\"language-text\">this</code>를 참조하기 때문에 외부 함수의 <code class=\"language-text\">this</code>와 동일하게 됩니다.<br>\n<br/></li>\n</ol>\n</li>\n<li>\n<p>인스턴스 <code class=\"language-text\">chanwoo</code>의 메소드 <code class=\"language-text\">methodA()</code>를 새로운 함수로 선언하여 호출하였습니다. 호출객체가 명시되어있지 않기 때문에 <code class=\"language-text\">methodA()</code>의 <code class=\"language-text\">this</code>는 전역객체에 바인딩 됩니다.  </p>\n<ol>\n<li><strong>전역객체 <code class=\"language-text\">window</code> -</strong> 내부 함수의 <code class=\"language-text\">this</code>는 외부 함수의 <code class=\"language-text\">this</code>로 바인딩되지 않고 전역객체에 바인딩 됩니다.<br>\n<br/> </li>\n<li><strong>전역객체 <code class=\"language-text\">window</code> -</strong> 화살표 함수의 <code class=\"language-text\">this</code> 는 렉시컬 스코프 상의 <code class=\"language-text\">this</code>를 참조하기 때문에 외부 함수의 <code class=\"language-text\">this</code>와 동일하게 됩니다. <code class=\"language-text\">methodA()</code>의 <code class=\"language-text\">this</code>는 전역객체에 바인딩 되기 때문에 동일하게 전역 객체에 바인딩 됩니다.<br>\n<br/> </li>\n</ol>\n</li>\n<li>\n<p>인스턴스 <code class=\"language-text\">chanwoo</code>의 메소드 <code class=\"language-text\">methodB()</code>를 새로운 함수 <code class=\"language-text\">methodBB()</code>로 선언하여 호출하였습니다. <code class=\"language-text\">methodB()</code>는 화살표 함수이므로 호출 객체가 명시되어있지 않음에도 렉시컬 스코프의 <code class=\"language-text\">this</code>를 참조합니다. <code class=\"language-text\">methodB()</code>가 선언된 생성자 함수의 <code class=\"language-text\">this</code>는 인스턴스 <code class=\"language-text\">chanwoo</code>가 바인딩 되기 때문에 <code class=\"language-text\">methodB()</code> 또한 인스턴스 <code class=\"language-text\">chanwoo</code>를 참조합니다.  </p>\n<ol>\n<li><strong>전역객체 <code class=\"language-text\">window</code> -</strong> 내부 함수의 <code class=\"language-text\">this</code>는 외부 함수의 <code class=\"language-text\">this</code>로 바인딩 되지 않고 전역객체에 바인딩 됩니다.<br>\n<br/>  </li>\n<li><strong>인스턴스 <code class=\"language-text\">chanwoo</code> -</strong> 화살표 함수의 <code class=\"language-text\">this</code>는 렉시컬 스코프 상의 <code class=\"language-text\">this</code>를 참조하기 때문에 외부 함수의 <code class=\"language-text\">this</code>와 동일하게 됩니다.<br>\n<br/> </li>\n</ol>\n</li>\n</ol>\n<h3 id=\"이외\" style=\"position:relative;\"><a href=\"#%EC%9D%B4%EC%99%B8\" aria-label=\"이외 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>이외</h3>\n<ul>\n<li>\n<p>이벤트 리스너의 경우, 이벤트가 등록되는 DOM element에 <code class=\"language-text\">this</code>가 바인딩됩니다.<br>\n<br/>  </p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">document<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'click'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                 \n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n</li>\n</ul>\n<br/>\n<h2 id=\"그래서-this을-말하자면\" style=\"position:relative;\"><a href=\"#%EA%B7%B8%EB%9E%98%EC%84%9C-this%EC%9D%84-%EB%A7%90%ED%95%98%EC%9E%90%EB%A9%B4\" aria-label=\"그래서 this을 말하자면 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>그래서 this을 말하자면..</h2>\n<hr>\n<p>  <code class=\"language-text\">this</code>는 함수 내에서 자신(함수)을 호출한 객체에 접근하기 위한 JS의 키워드입니다. 하지만 <code class=\"language-text\">this</code>가 호출 객체가 바인딩 되지 않는 경우도 존재합니다. 이러한 경우를 네 가지의 바인딩 룰을 통해 소개하였습니다.</p>\n<ol>\n<li><strong><code class=\"language-text\">this</code>는 호출 객체에 바인딩 되지만 호출 객체가 명시되어있지 않는 경우, 전역 객체에 바인딩 됩니다.</strong>    </li>\n<li><strong>내부 함수의 <code class=\"language-text\">this</code>는 외부함수의 <code class=\"language-text\">this</code>로 바인딩 되지 않습니다.</strong>    </li>\n<li><strong>화살표 함수의 <code class=\"language-text\">this</code>는 렉시컬 스코프의 <code class=\"language-text\">this</code>를 참조합니다.</strong></li>\n<li><strong>클래스의 내부 코드들은 <em>'strict mode'</em> 로 수행됩니다. <em>'strict mode'</em> 에서는 전역 객체에 대한 바인딩이 수행되지 않기 때문에 <code class=\"language-text\">this</code>는 <code class=\"language-text\">undefined</code>가 됩니다.</strong>  </li>\n</ol>\n<p>  이렇게 네 가지 규칙만으로도 <code class=\"language-text\">this</code>를 사용하는 대부분의 코드를 이해할 수 있을 것입니다. 추가로 바인딩을 명시적으로 하기 위해 제공하는 메소드들 소개하겠습니다.</p>\n<br/>\n<br/>\n<h2 id=\"-this-바인딩-관련-메소드\" style=\"position:relative;\"><a href=\"#-this-%EB%B0%94%EC%9D%B8%EB%94%A9-%EA%B4%80%EB%A0%A8-%EB%A9%94%EC%86%8C%EB%93%9C\" aria-label=\" this 바인딩 관련 메소드 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>+ this 바인딩 관련 메소드</h2>\n<hr>\n<p>  <code class=\"language-text\">this</code>의 바인딩이 의도한 방향으로 되지 않는 경우가 있다고 설명하였습니다. <strong>이를 피하고자 JS는 바인딩을 명시적으로 지정하는 메소드를 제공합니다.</strong> 이 <code class=\"language-text\">this</code> 바인딩 메소드들은 <code class=\"language-text\">Function.prototype</code>에 선언되어있기 때문에 모든 함수에서 사용이 가능합니다.<br>\n<br/></p>\n<h3 id=\"1-code-classlanguage-textbindltobjectgtcode\" style=\"position:relative;\"><a href=\"#1-code-classlanguage-textbindltobjectgtcode\" aria-label=\"1 code classlanguage textbindltobjectgtcode permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. <code class=\"language-text\">bind(&lt;object&gt;)</code></h3>\n<blockquote>\n<p><strong>호출하는 함수의 <code class=\"language-text\">this</code>에 인자로 전달한 객체를 바인딩한 함수를 반환합니다.</strong></p>\n</blockquote>\n<p>  4번 규칙의 3번 예시를 보면 메소드를 외부에서 사용하고자 할 때, 호출 객체에 명시되어있지 않아 <code class=\"language-text\">this</code>가 전역객체로 바인딩됩니다. 인스턴스를 바인딩하고자 할 때, 이 함수를 사용하여 <code class=\"language-text\">this</code>를 명시적으로 바인딩 합니다. 이때 함수의 호출이 아닌 <strong>함수의 선언</strong>임을 기억해야 합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">Human</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">methodA</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>              \n\t\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> chanwoo <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Human</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> methodAA <span class=\"token operator\">=</span> chanwoo<span class=\"token punctuation\">.</span>methodA<span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">methodAA</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                               <span class=\"token comment\">// .... 1                </span>\n\n<span class=\"token keyword\">const</span> methodAAA <span class=\"token operator\">=</span> <span class=\"token function\">methodAA</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span>chanwoo<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">methodAAA</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                               <span class=\"token comment\">// .... 2</span></code></pre></div>\n<ol>\n<li><strong>전역객체 <code class=\"language-text\">window</code> -</strong> 내부 함수의 <code class=\"language-text\">this</code>는 외부 함수의 <code class=\"language-text\">this</code>로 바인딩되지 않고 전역객체에 바인딩됩니다.<br>\n<br/></li>\n<li><strong>인스턴스 <code class=\"language-text\">chanwoo</code> -</strong> <code class=\"language-text\">bind()</code>를 통해 명시적으로 <code class=\"language-text\">chanwoo</code>로 바인딩하였습니다.<br>\n<br/></li>\n</ol>\n<h3 id=\"2-code-classlanguage-textcallltobjectgt-ltparamsgtcode\" style=\"position:relative;\"><a href=\"#2-code-classlanguage-textcallltobjectgt-ltparamsgtcode\" aria-label=\"2 code classlanguage textcallltobjectgt ltparamsgtcode permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. <code class=\"language-text\">call(&lt;object&gt;, ...&lt;params&gt;)</code></h3>\n<blockquote>\n<p><strong>호출하는 함수의 <code class=\"language-text\">this</code>에 인자로 전달한 객체를 바인딩하여 함수를 수행합니다.</strong> </p>\n</blockquote>\n<p>  이미 할당되어있는 객체의 메소드를 다른 객체에 바인딩하여 호출하기 위해 사용합니다. 아래의 <code class=\"language-text\">apply()</code>와의 차이점은 함수 인자 전달 방식입니다. 바인딩할 객체 이후 모든 파라미터가 수행할 함수의 파라미터로 사용됩니다.  </p>\n<br/>\n<h3 id=\"3-code-classlanguage-textapplyltobjectgt-ltparamsgtcode\" style=\"position:relative;\"><a href=\"#3-code-classlanguage-textapplyltobjectgt-ltparamsgtcode\" aria-label=\"3 code classlanguage textapplyltobjectgt ltparamsgtcode permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. <code class=\"language-text\">apply(&lt;object&gt;, [&lt;params&gt;])</code></h3>\n<blockquote>\n<p><strong>호출하는 함수의 <code class=\"language-text\">this</code>에 인자로 전달한 객체를 바인딩하여 함수를 수행합니다.</strong>  </p>\n</blockquote>\n<p>  이미 할당되어있는 객체의 메소드를 다른 객체에 바인딩하여 호출하기 위해 사용합니다.  아래의 <code class=\"language-text\">apply()</code>와의 차이점은 함수 인자 전달 방식입니다. 바인딩할 객체 이후 전달되는 배열이 수행할 함수의 파라미터로 사용됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">Human</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">name</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">methodA</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token operator\">?.</span>name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">methodB</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">age<span class=\"token punctuation\">,</span> gender</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">, </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>age<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">, </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>gender<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> chanwoo <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Human</span><span class=\"token punctuation\">(</span><span class=\"token string\">'chanwoo'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> chanjong <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Human</span><span class=\"token punctuation\">(</span><span class=\"token string\">'chanjong'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> methodBB <span class=\"token operator\">=</span> chanwoo<span class=\"token punctuation\">.</span>methodB<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 함수 인자 전달</span>\n<span class=\"token function\">methodBB</span><span class=\"token punctuation\">.</span><span class=\"token function\">call</span><span class=\"token punctuation\">(</span>chanjong<span class=\"token punctuation\">,</span> <span class=\"token number\">26</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'man'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 함수 인자 전달시, 배열을 통한 전달</span>\n<span class=\"token function\">methodBB</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span>chanjong<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token number\">26</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'man'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>  <code class=\"language-text\">call()</code>을 통해 명시적으로 바인딩할 함수 <code class=\"language-text\">methodBB</code>의 인자는 바인딩 될 객체 이후에 인자로 전달합니다. 반면에 <code class=\"language-text\">apply()</code>의 경우, 인자를 배열로 전달합니다. 인자 전달 방법의 차이를 제외하고 명시적으로 <code class=\"language-text\">this</code>를 바인딩하여 함수를 수행하는 기능은 동일합니다.</p>","excerpt":"this란? 함수 내에서 함수를 호출한 객체에 접근하기 위한 JS의 키워드   함수 내에서 를 보신 적이 있으신가요? 특히 나 객체를 생성하기 위해서 선언하는 함수를 사용한 경험이 있다면, 를 많이 보셨을 겁니다. python의 와 같이 는 기본적으…","tableOfContents":"<ul>\n<li>\n<p><a href=\"/this/#this%EB%9E%80\">this란?</a></p>\n<ul>\n<li>\n<p><a href=\"/this/#%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90\">기본 개념</a></p>\n<ul>\n<li><a href=\"/this/#1-code-classlanguage-textnewcode-%EC%97%B0%EC%82%B0%EC%9E%90%EB%A5%BC-%ED%86%B5%ED%95%9C-%EA%B0%9D%EC%B2%B4%EC%9D%98-%EC%83%9D%EC%84%B1-%EA%B3%BC%EC%A0%95\">1. <code class=\"language-text\">new</code> 연산자를 통한 객체의 생성 과정</a></li>\n<li><a href=\"/this/#2-lexical-scope\">2. lexical scope</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li>\n<p><a href=\"/this/#this-%EB%B0%94%EC%9D%B8%EB%94%A9-%EB%A3%B0\">this 바인딩 룰</a></p>\n<ul>\n<li>\n<ul>\n<li><a href=\"/this/#1-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9C%BC%EB%A1%9C-code-classlanguage-textthiscode%EB%8A%94-%ED%95%A8%EC%88%98%EB%A5%BC-%ED%98%B8%EC%B6%9C%ED%95%98%EB%8A%94-%EA%B0%9D%EC%B2%B4%EC%97%90-%EB%B0%94%EC%9D%B8%EB%94%A9-%EB%90%A9%EB%8B%88%EB%8B%A4-%ED%98%B8%EC%B6%9C%ED%95%98%EB%8A%94-%EA%B0%9D%EC%B2%B4%EA%B0%80-%EB%AA%85%EC%8B%9C%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%80-%EB%8B%A8%EC%88%9C-%ED%95%A8%EC%88%98-%ED%98%B8%EC%B6%9C%EC%9D%98-%EA%B2%BD%EC%9A%B0-%EC%A0%84%EC%97%AD%EA%B0%9D%EC%B2%B4%EC%97%90-%EB%B0%94%EC%9D%B8%EB%94%A9-%EB%90%A9%EB%8B%88%EB%8B%A4\">1. 기본적으로 <code class=\"language-text\">this</code>는 함수를 호출하는 객체에 바인딩 됩니다. 호출하는 객체가 명시되지 않은 단순 함수 호출의 경우, 전역객체에 바인딩 됩니다.</a></li>\n<li><a href=\"/this/#2-%ED%95%A8%EC%88%98%EC%9D%98-%EB%82%B4%EB%B6%80-%ED%95%A8%EC%88%98%EB%8A%94-%EC%99%B8%EB%B6%80-%ED%95%A8%EC%88%98%EC%9D%98-code-classlanguage-textthiscode%EB%A1%9C-%EB%B0%94%EC%9D%B8%EB%94%A9-%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4\">2. 함수의 내부 함수는 외부 함수의 <code class=\"language-text\">this</code>로 바인딩 되지 않습니다.</a></li>\n<li><a href=\"/this/#3-%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98arrow-function%EC%9D%98-%EA%B2%BD%EC%9A%B0-code-classlanguage-textthiscode%EA%B0%80-%EC%A1%B4%EC%9E%AC%ED%95%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4-%EA%B7%B8%EB%9F%AC%EB%AF%80%EB%A1%9C-%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98-%EB%82%B4%EC%9D%98-code-classlanguage-textthiscode%EB%8A%94-%EB%8B%A4%EB%A5%B8-%EB%B3%80%EC%88%98%EC%99%80-%EB%8F%99%EC%9D%BC%ED%95%98%EA%B2%8C-%ED%95%A8%EC%88%98%EC%9D%98-%EB%A0%89%EC%8B%9C%EC%BB%AC-%EC%8A%A4%EC%BD%94%ED%94%84-%EC%83%81%EC%9D%98-code-classlanguage-textthiscode%EB%A5%BC-%EC%B0%B8%EC%A1%B0%ED%95%A9%EB%8B%88%EB%8B%A4\">3. 화살표 함수(Arrow function)의 경우, <code class=\"language-text\">this</code>가 존재하지 않습니다. 그러므로 화살표 함수 내의 <code class=\"language-text\">this</code>는 다른 변수와 동일하게 함수의 렉시컬 스코프 상의 <code class=\"language-text\">this</code>를 참조합니다.</a></li>\n<li><a href=\"/this/#4-%ED%81%B4%EB%9E%98%EC%8A%A4class%EC%9D%98-%EA%B2%BD%EC%9A%B0-%ED%95%A8%EC%88%98-%EB%B8%94%EB%A1%9D-%EC%83%81%EC%9D%98-%EB%AA%A8%EB%93%A0-%EC%BD%94%EB%93%9C%EB%8A%94-strict-mode%EB%A1%9C-%EC%88%98%ED%96%89%EB%90%A9%EB%8B%88%EB%8B%A4--strict-mode%EB%8A%94-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9C%BC%EB%A1%9C-code-classlanguage-textthiscode%EB%A5%BC-%EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C-%EB%B0%94%EC%9D%B8%EB%94%A9%ED%95%98%EC%A7%80-%EC%95%8A%EC%9C%BC%EB%A9%B0-%ED%98%B8%EC%B6%9C-%EA%B0%9D%EC%B2%B4%EA%B0%80-%EB%AA%85%EC%8B%9C%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%80-%EA%B2%BD%EC%9A%B0-code-classlanguage-textundefinedcode%EB%A5%BC-%EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4\">4. <strong>클래스(Class)의 경우, 함수 블록 상의 모든 코드는 <em>'strict mode'</em>로 수행됩니다.  '<em>strict mode</em>'는 기본적으로 <code class=\"language-text\">this</code>를 자동으로 바인딩하지 않으며, 호출 객체가 명시되지 않은 경우, <code class=\"language-text\">undefined</code>를 반환합니다.</strong></a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/this/#%EC%A1%B0%EA%B8%88-%EB%8D%94-%EB%B3%B5%EC%9E%A1%ED%95%9C-%EC%98%88\">조금 더 복잡한 예</a></p>\n<ul>\n<li><a href=\"/this/#%EC%9D%B4%EC%99%B8\">이외</a></li>\n</ul>\n</li>\n<li><a href=\"/this/#%EA%B7%B8%EB%9E%98%EC%84%9C-this%EC%9D%84-%EB%A7%90%ED%95%98%EC%9E%90%EB%A9%B4\">그래서 this을 말하자면..</a></li>\n<li>\n<p><a href=\"/this/#-this-%EB%B0%94%EC%9D%B8%EB%94%A9-%EA%B4%80%EB%A0%A8-%EB%A9%94%EC%86%8C%EB%93%9C\">+ this 바인딩 관련 메소드</a></p>\n<ul>\n<li><a href=\"/this/#1-code-classlanguage-textbindltobjectgtcode\">1. <code class=\"language-text\">bind(&lt;object&gt;)</code></a></li>\n<li><a href=\"/this/#2-code-classlanguage-textcallltobjectgt-ltparamsgtcode\">2. <code class=\"language-text\">call(&lt;object&gt;, ...&lt;params&gt;)</code></a></li>\n<li><a href=\"/this/#3-code-classlanguage-textapplyltobjectgt-ltparamsgtcode\">3. <code class=\"language-text\">apply(&lt;object&gt;, [&lt;params&gt;])</code></a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>","fields":{"slug":"/this/"},"frontmatter":{"title":"JS의 기본 개념 2. this","date":"Nov 06, 2021","tags":["JS","Vanila","Front-End"],"keywords":["무지성 개발 탈출기","Chanuuuu"],"update":"Jan 01, 0001"}}},"pageContext":{"slug":"/this/","series":[],"lastmod":"2021-11-06"}},"staticQueryHashes":["2027115977","694178885"]}